#include <cstdio>

struct Node
{
    int v, l, r;
    bool buf;
};

int max( int a, int b ) { return ( a > b )?a :b; }

Node a[ 800000 ];
int n, pos;

void init( )
{
    int i;
    scanf("%d", &n);
    pos = 1;
    while ( pos < n ) pos <<= 1;
    for ( i = pos; i < pos * 2; i++ )
        a[ i ].l = a[ i ].r = i - pos + 1;
    for ( i = pos - 1; i >= 1; i-- )
    {
        a[ i ].l = a[ i * 2 ].l;
        a[ i ].r = a[ i * 2 + 1 ].r;
    }
    a[ 1 ].v = 1;
    a[ 1 ].buf = true;
}

void change( int p, int l, int r, int v )
{
    if ( l < a[ p ].l ) l = a[ p ].l;
    if ( r > a[ p ].r ) r = a[ p ].r;
    if ( l > a[ p ].r || r < a[ p ].l ) return ;
    if ( l == a[ p ].l && r == a[ p ].r )
    {
        a[ p ].v = v;
        a[ p ].buf = true;
    }
    else
    {
        if ( a[ p ].buf )
        {
            a[ p * 2 ].v = a[ p ].v;
            a[ p * 2 ].buf = true;
            a[ p * 2 + 1 ].v = a[ p ].v;
            a[ p * 2 + 1 ].buf = true;
            a[ p ].buf = false;
        }
        change( p * 2, l, r, v );
        change( p * 2 + 1, l, r, v );
    }
}

int query( int p, int l, int r )
{
    if ( l < a[ p ].l ) l = a[ p ].l;
    if ( r > a[ p ].r ) r = a[ p ].r;
    if ( l > a[ p ].r || r < a[ p ].l ) return -1;
    if ( l == a[ p ].l && r == a[ p ].r )
        return a[ p ].v;
    if ( a[ p ].buf )
    {
        a[ p * 2 ].v = a[ p ].v;
        a[ p * 2 ].buf = true;
        a[ p * 2 + 1 ].v = a[ p ].v;
        a[ p * 2 + 1 ].buf = true;
        a[ p ].buf = false;
    }
    return max( query( p * 2, l, r ), query( p * 2 + 1, l, r ) );
}

void work( )
{
    int i, ans = 0, x, y, z, m;
    scanf("%d", &m);
    while ( m-- )
    {
        scanf("%d%d%d", &x, &y, &z);
        change( 1, x, y, z );
    }
    for ( i = 1; i <= n; i++ )
        ans += query( 1, i, i );
    printf("%d.\n", ans);
}


int main( )
{
    int i, t;
    scanf("%d", &t);
    for ( i = 1; i <= t; i++ )
    {
        init( );
        printf("Case %d: The total value of the hook is ", i);
        work( );
    }
    return 0;
}
